﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AGPR.Locadora.Utils
{
    /// <summary>
    /// Classe de Paginação Utilizada no Módulo Web
    /// </summary>
    public class Paginacao
    {
        #region Atributos

        /// <summary>
        /// Número Total de Itens
        /// </summary> 
        private int total = 0;

        /// <summary>
        /// Número de Itens por Página
        /// </summary>
        private int por_pagina = 0;

        /// <summary>
        /// Número da Página Atual
        /// </summary>
        private int pagina_atual = 0;

        /// <summary>
        /// Número da Página Anterior
        /// </summary>
        private int pagina_anterior = 0;

        /// <summary>
        /// Número da Página Seguinte
        /// </summary>
        private int pagina_seguinte = 0;

        /// <summary>
        /// Número Total de Páginas
        /// </summary>
        private int total_paginas = 0;

        /// <summary>
        /// Offset da Consulta no Banco de Dados
        /// </summary>
        private int offset = 0;

        /// <summary>
        /// Html gerado
        /// </summary>
        private string html;

        public string prevText = "<";
        public string nextText = ">";
        public string startText = "<<";
        public string endText = ">>";

        /// <summary>
        /// Retorna o html Gerado Pela Paginação
        /// </summary>        
        public string Html
        {
            get
            {
                return this.html;
            }
        }

        /// <summary>
        /// Retorna o Offset gerado para a Consulta
        /// </summary>
        public int Offset
        {
            get
            {
                return this.offset;
            }
        }

        #endregion

        #region Construtor

        /// <summary>
        /// Retorna uma Nova Instância da Paginação
        /// </summary>
        /// <param name="total">Total de Itens na Base</param>
        /// <param name="pagina_atual">Página Atual</param>
        /// <returns></returns>
        public static Paginacao init(int total, int pagina_atual = 1)
        {
            return new Paginacao(total, pagina_atual);
        }

        /// <summary>
        /// Construtor
        /// </summary>
        /// <param name="total">Total de Itens na Base</param>
        /// <param name="pagina_atual">Página Atual</param>
        public Paginacao(int total, int pagina_atual = 1)
        {
            this.total = total;
            this.pagina_atual = pagina_atual;
            this.por_pagina = Config.PageLimit;
            this.html = this.Processar();
        }

        #endregion

        #region Processar

        /// <summary>
        /// Faz o Processamento para a geração da navegação
        /// </summary>
        /// <returns></returns>
        public string Processar()
        {
            string html = "";

            // Cálculo o número Total de Páginas
            this.total_paginas = (int) Math.Ceiling((double) this.total / this.por_pagina);

            // Se os dados estivarem em branco retorno um html vazio
            if (this.total == 0 || this.por_pagina == 0 || this.total_paginas == 0)
            {
                return html;
            }

            // Cálculo o número da Página Anterior
            this.pagina_anterior = this.pagina_atual - 1;
            // Cálculo o número da Página Seguinte
            this.pagina_seguinte = this.pagina_atual + 1;

            // Bloqueio na Página Anterior
            this.pagina_anterior = this.pagina_atual <= 1 ? 1 : this.pagina_anterior;

            // Bloqueio na Página Seguinte
            if (this.pagina_atual >= this.total_paginas)
            {
                this.pagina_seguinte = this.total_paginas;
            }

            // Offset para consulta no banco
            if (this.pagina_atual > 1)
            {
                this.offset = this.pagina_anterior * this.por_pagina;
            }            

            // Montagem de navegação
            for (int i = 1; i <= this.total_paginas; ++i)
            {
                if (i == this.pagina_atual)
                {
                    html += "<strong>" + i + "</strong>";
                }
                else
                {
                    html += "<a href=\"?p=" + i + "\">" + i + "</a>";
                }
            }

            return html;
        }

        #endregion
    }
}
